package charpter01_basic.lession04_wait_notify_notifyall;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 此类中的wait()方法没有放在synchronized方法块中
 * 于是便有可能发生以下场景：
 *
 * 首先，消费者线程调用 take 方法并判断 buffer.isEmpty 方法是否返回 true，
 *  若为 true 代表buffer是空的，则线程希望进入等待，但是在线程调用 wait 方法之前，就被调度器暂停了，
 *  所以此时还没来得及执行 wait 方法。
 * 此时生产者开始运行，执行了整个 give 方法，它往 buffer 中添加了数据，
 * 并执行了 notify 方法，但 notify 并没有任何效果，因为消费者线程的 wait 方法没来得及执行，
 * 所以没有线程在等待被唤醒。
 * 此时，刚才被调度器暂停的消费者线程回来继续执行 wait 方法并进入了等待。
 */
public class BlockingQueueWithoutSynchronized implements MyBlockingQueue{
    Queue<String> buffer = new LinkedList<>();
    public void give(String data) {
        buffer.add(data);
        notify();  // Since someone may be waiting in take
    }

    public String take() throws InterruptedException {
        while (buffer.isEmpty()) {
            wait();
        }
        return buffer.remove();
    }
}
